/**
 * 研发项目快照模型
 * 用于记录项目主要信息历史版本
 */
const { BaseModel } = require('../config/models_config');

class ResearchProjectSnapshotModel extends BaseModel {
	constructor() {
		super();
		this.setCollection('research_project_snapshot');
	}

	/**
	 * 获取快照类型名称
	 * @param {Number} type 快照类型
	 * @returns {String} 快照类型名称
	 */
	static getSnapshotTypeName(type) {
		return this.SNAPSHOT_TYPE_NAME[type] || '未知';
	}
	
	/**
	 * 获取快照状态名称
	 * @param {Number} status 快照状态
	 * @returns {String} 快照状态名称
	 */
	static getSnapshotStatusName(status) {
		return this.SNAPSHOT_STATUS_NAME[status] || '未知';
	}
	
	/**
	 * 计算两个快照之间的差异
	 * @param {Object} snapshot1 快照1
	 * @param {Object} snapshot2 快照2
	 * @returns {Object} 差异对象
	 */
	static calculateDiff(snapshot1, snapshot2) {
		if (!snapshot1 || !snapshot2) return null;
		
		const diff = {
			projectStatus: snapshot1.PROJECT_STATUS !== snapshot2.PROJECT_STATUS,
			resourceVersions: {},
			hardwareStatus: {},
			softwareStatus: {},
			docStatus: {}
		};
		
		// 对比资源版本
		if (snapshot1.RESOURCE_VERSIONS && snapshot2.RESOURCE_VERSIONS) {
			const resources1 = snapshot1.RESOURCE_VERSIONS.reduce((acc, res) => {
				acc[res.RESOURCE_ID] = res;
				return acc;
			}, {});
			
			const resources2 = snapshot2.RESOURCE_VERSIONS.reduce((acc, res) => {
				acc[res.RESOURCE_ID] = res;
				return acc;
			}, {});
			
			// 找出所有资源ID
			const allResourceIds = [...new Set([
				...Object.keys(resources1),
				...Object.keys(resources2)
			])];
			
			// 比较每个资源
			allResourceIds.forEach(id => {
				const res1 = resources1[id];
				const res2 = resources2[id];
				
				if (!res1) {
					diff.resourceVersions[id] = { type: 'added', data: res2 };
				} else if (!res2) {
					diff.resourceVersions[id] = { type: 'removed', data: res1 };
				} else if (res1.VERSION !== res2.VERSION) {
					diff.resourceVersions[id] = { 
						type: 'changed', 
						from: res1.VERSION, 
						to: res2.VERSION,
						data: { before: res1, after: res2 }
					};
				}
			});
		}
		
		// 对比硬件状态
		if (snapshot1.HARDWARE_STATUS && snapshot2.HARDWARE_STATUS) {
			const hs1 = snapshot1.HARDWARE_STATUS;
			const hs2 = snapshot2.HARDWARE_STATUS;
			
			if (hs1.schematicVersion !== hs2.schematicVersion) {
				diff.hardwareStatus.schematicVersion = {
					type: 'changed',
					from: hs1.schematicVersion,
					to: hs2.schematicVersion
				};
			}
			
			if (hs1.pcbVersion !== hs2.pcbVersion) {
				diff.hardwareStatus.pcbVersion = {
					type: 'changed',
					from: hs1.pcbVersion,
					to: hs2.pcbVersion
				};
			}
			
			if (hs1.bomVersion !== hs2.bomVersion) {
				diff.hardwareStatus.bomVersion = {
					type: 'changed',
					from: hs1.bomVersion,
					to: hs2.bomVersion
				};
			}
		}
		
		// 对比软件状态
		if (snapshot1.SOFTWARE_STATUS && snapshot2.SOFTWARE_STATUS) {
			const ss1 = snapshot1.SOFTWARE_STATUS;
			const ss2 = snapshot2.SOFTWARE_STATUS;
			
			if (ss1.softwareVersion !== ss2.softwareVersion) {
				diff.softwareStatus.softwareVersion = {
					type: 'changed',
					from: ss1.softwareVersion,
					to: ss2.softwareVersion
				};
			}
			
			if (ss1.buildNumber !== ss2.buildNumber) {
				diff.softwareStatus.buildNumber = {
					type: 'changed',
					from: ss1.buildNumber,
					to: ss2.buildNumber
				};
			}
		}
		
		return diff;
	}
}

// 快照类型枚举
ResearchProjectSnapshotModel.SNAPSHOT_TYPE = {
	MILESTONE: 1, // 里程碑快照
	DELIVERY: 2, // 交付版本快照
	PRODUCTION: 3, // 生产版本快照
	CUSTOMER_FEEDBACK: 4, // 客户反馈快照
	RELEASE: 5 // 正式发布快照
};

// 快照类型名称
ResearchProjectSnapshotModel.SNAPSHOT_TYPE_NAME = {
	[ResearchProjectSnapshotModel.SNAPSHOT_TYPE.MILESTONE]: '里程碑快照',
	[ResearchProjectSnapshotModel.SNAPSHOT_TYPE.DELIVERY]: '交付版本快照',
	[ResearchProjectSnapshotModel.SNAPSHOT_TYPE.PRODUCTION]: '生产版本快照',
	[ResearchProjectSnapshotModel.SNAPSHOT_TYPE.CUSTOMER_FEEDBACK]: '客户反馈快照',
	[ResearchProjectSnapshotModel.SNAPSHOT_TYPE.RELEASE]: '正式发布快照'
};

// 快照状态枚举
ResearchProjectSnapshotModel.SNAPSHOT_STATUS = {
	NORMAL: 1, // 普通快照
	BASELINE: 2, // 基线快照
	LOCKED: 3, // 已锁定快照
	EXPORTED: 4, // 已导出快照
	ARCHIVED: 5 // 已归档快照
};

// 快照状态名称
ResearchProjectSnapshotModel.SNAPSHOT_STATUS_NAME = {
	[ResearchProjectSnapshotModel.SNAPSHOT_STATUS.NORMAL]: '普通快照',
	[ResearchProjectSnapshotModel.SNAPSHOT_STATUS.BASELINE]: '基线快照',
	[ResearchProjectSnapshotModel.SNAPSHOT_STATUS.LOCKED]: '已锁定快照',
	[ResearchProjectSnapshotModel.SNAPSHOT_STATUS.EXPORTED]: '已导出快照',
	[ResearchProjectSnapshotModel.SNAPSHOT_STATUS.ARCHIVED]: '已归档快照'
};

// 数据结构定义
ResearchProjectSnapshotModel.DB_STRUCTURE = {
	_id: 'string|true',
	SNAPSHOT_NAME: 'string|true|comment=快照名称',
	SNAPSHOT_TYPE: 'int|true|default=1|comment=快照类型：1=里程碑快照,2=交付版本快照,3=生产版本快照,4=客户反馈快照,5=正式发布快照',
	SNAPSHOT_DESC: 'string|false|comment=快照描述',
	SNAPSHOT_STATUS: 'int|true|default=1|comment=快照状态：1=普通快照,2=基线快照,3=已锁定快照,4=已导出快照,5=已归档快照',
	SNAPSHOT_TAGS: 'array|true|default=[]|comment=快照标签',
	
	PROJECT_ID: 'string|true|comment=项目ID',
	PROJECT_NAME: 'string|true|comment=项目名称',
	PROJECT_CODE: 'string|true|comment=项目编码',
	PROJECT_STATUS: 'int|true|comment=项目状态',
	PROJECT_SUB_STATUS: 'int|false|comment=项目子状态',
	PROJECT_ACTIVE_STATUS: 'int|false|comment=项目活动状态',
	
	STATE_HISTORY_ID: 'string|true|comment=状态历史ID',
	
	BRANCH_ID: 'string|false|comment=分支ID',
	BRANCH_NAME: 'string|false|comment=分支名称',
	
	PARENT_SNAPSHOT_ID: 'string|false|comment=父快照ID',
	BASE_SNAPSHOT_ID: 'string|false|comment=基线快照ID',
	
	RESOURCE_VERSIONS: 'array|true|default=[]|comment=资源版本快照',
	/*
	[
		{
			RESOURCE_ID: 'string', // 资源ID
			RESOURCE_NAME: 'string', // 资源名称
			RESOURCE_TYPE: 'number', // 资源类型：0=PCB,1=BOM,2=包装指引,3=加工指引,4=物料变更通知,5=认证报告,等
			VERSION: 'string', // 版本号
			VERSION_DESC: 'string', // 版本描述
			FILE_URL: 'string', // 文件链接
			FILE_MD5: 'string', // 文件MD5
			RESOURCE_SIZE: 'number', // 资源大小
		}
	]
	*/
	
	PROJECT_FULL_STATUS: 'object|true|default={}|comment=项目完整状态',
	/*
	{
		PROJECT_REQUIREMENT_DOCS_COMPLETE: 'number', // 需求文档完整度
		PROJECT_DESIGN_DOCS_COMPLETE: 'number', // 设计文档完整度
		PROJECT_TEST_DOCS_COMPLETE: 'number', // 测试文档完整度
		PROJECT_PRODUCTION_DOCS_COMPLETE: 'number', // 生产文档完整度
		PROJECT_PROGRESS: 'number', // 项目进度
		// ... 其他项目状态信息
	}
	*/
	
	HARDWARE_STATUS: 'object|true|default={}|comment=硬件状态',
	/*
	{
		schematicVersion: 'string', // 原理图版本
		pcbVersion: 'string', // PCB版本
		bomVersion: 'string', // BOM版本
		hardwareIssues: 'array', // 已知硬件问题
		hardwareStatus: 'number', // 硬件状态
		// ... 其他硬件相关信息
	}
	*/
	
	SOFTWARE_STATUS: 'object|true|default={}|comment=软件状态',
	/*
	{
		softwareVersion: 'string', // 软件版本
		buildNumber: 'string', // 构建号
		softwareIssues: 'array', // 已知软件问题
		softwareStatus: 'number', // 软件状态
		// ... 其他软件相关信息
	}
	*/
	
	GITEA_TAG: 'string|false|comment=Gitea代码标签',
	GITEA_COMMIT: 'string|false|comment=Gitea提交ID',
	
	CUSTOMER_CONFIRM_STATUS: 'int|false|comment=客户确认状态',
	CUSTOMER_FEEDBACK: 'string|false|comment=客户反馈',
	
	BOM_SNAPSHOT: 'object|false|comment=BOM快照',
	PRODUCT_CONFIG_SNAPSHOT: 'object|false|comment=产品配置快照',
	
	IS_CURRENT: 'int|true|default=1|comment=是否为当前快照：0=否,1=是',
	IS_EXPORTED: 'int|true|default=0|comment=是否已导出：0=否,1=是',
	EXPORT_TIME: 'int|false|comment=导出时间',
	EXPORT_USER_ID: 'string|false|comment=导出用户ID',
	EXPORT_USER_NAME: 'string|false|comment=导出用户姓名',
	EXPORT_FILES: 'array|true|default=[]|comment=导出文件',
	/*
	[
		{
			FILE_NAME: 'string', // 文件名
			FILE_URL: 'string', // 文件URL
			FILE_SIZE: 'number', // 文件大小
			FILE_TYPE: 'string', // 文件类型
			CREATE_TIME: 'number', // 创建时间
		}
	]
	*/
	
	IS_LOCKED: 'int|true|default=0|comment=是否已锁定：0=否,1=是',
	LOCK_TIME: 'int|false|comment=锁定时间',
	LOCK_USER_ID: 'string|false|comment=锁定用户ID',
	LOCK_USER_NAME: 'string|false|comment=锁定用户姓名',
	LOCK_REASON: 'string|false|comment=锁定原因',
	
	HAS_BEEN_RESTORED: 'int|true|default=0|comment=是否曾被恢复：0=否,1=是',
	RESTORE_HISTORY: 'array|true|default=[]|comment=恢复历史',
	/*
	[
		{
			RESTORE_TIME: 'number', // 恢复时间
			RESTORE_USER_ID: 'string', // 恢复用户ID
			RESTORE_USER_NAME: 'string', // 恢复用户姓名
			RESTORE_REASON: 'string', // 恢复原因
			RESTORE_PROJECT_ID: 'string', // 恢复到的项目ID
		}
	]
	*/
	
	CREATOR_ID: 'string|true|comment=创建人ID',
	CREATOR_NAME: 'string|true|comment=创建人姓名',
	CREATE_TIME: 'int|true|comment=创建时间',
	UPDATE_TIME: 'int|true|comment=更新时间',
	
	// 统计信息
	RESOURCE_COUNT: 'int|true|default=0|comment=资源数量',
	DOC_COUNT: 'int|true|default=0|comment=文档数量',
	ISSUE_COUNT: 'int|true|default=0|comment=问题数量',
	TOTAL_SIZE: 'int|true|default=0|comment=总大小(KB)'
};

module.exports = ResearchProjectSnapshotModel; 